#ifndef MQTT_PROTOCOL_H
#define MQTT_PROTOCOL_H

// 包含必要的头文件
#include "protocol.h"
#include <mqtt.h>
#include <udp.h>
#include <cJSON.h>
#include <mbedtls/aes.h>
#include <freertos/FreeRTOS.h>
#include <freertos/event_groups.h>

#include <functional>
#include <string>
#include <map>
#include <mutex>

// MQTT协议相关常量定义
#define MQTT_PING_INTERVAL_SECONDS 90  // MQTT心跳包发送间隔（秒）
#define MQTT_RECONNECT_INTERVAL_MS 10000  // MQTT重连间隔（毫秒）

// 事件组标志位定义
#define MQTT_PROTOCOL_SERVER_HELLO_EVENT (1 << 0)  // 服务器hello消息事件标志

// MQTT协议实现类
class MqttProtocol : public Protocol {
public:
    MqttProtocol();  // 构造函数
    ~MqttProtocol();  // 析构函数

    // 协议接口实现
    void Start() override;  // 启动协议
    void SendAudio(const std::vector<uint8_t>& data) override;  // 发送音频数据
    bool OpenAudioChannel() override;  // 打开音频通道
    void CloseAudioChannel() override;  // 关闭音频通道
    bool IsAudioChannelOpened() const override;  // 检查音频通道是否打开

private:
    EventGroupHandle_t event_group_handle_;  // FreeRTOS事件组句柄

    // MQTT连接参数
    std::string endpoint_;  // MQTT服务器地址
    std::string client_id_;  // 客户端ID
    std::string username_;  // 用户名
    std::string password_;  // 密码
    std::string publish_topic_;  // 发布主题

    // 通道管理
    std::mutex channel_mutex_;  // 通道互斥锁
    Mqtt* mqtt_ = nullptr;  // MQTT客户端实例
    Udp* udp_ = nullptr;  // UDP客户端实例

    // 加密相关
    mbedtls_aes_context aes_ctx_;  // AES加密上下文
    std::string aes_nonce_;  // AES加密随机数
    std::string udp_server_;  // UDP服务器地址
    int udp_port_;  // UDP端口
    uint32_t local_sequence_;  // 本地序列号
    uint32_t remote_sequence_;  // 远程序列号

    // 私有方法
    bool StartMqttClient(bool report_error=false);  // 启动MQTT客户端
    void ParseServerHello(const cJSON* root);  // 解析服务器hello消息
    std::string DecodeHexString(const std::string& hex_string);  // 解码十六进制字符串

    void SendText(const std::string& text) override;  // 发送文本消息
};

#endif // MQTT_PROTOCOL_H
